package com.zhouyu.paydemo.unipay.qrcode.c2c.zs;

import com.zhouyu.paydemo.unipay.qrcode.DemoBase;
import com.zhouyu.paydemo.unipay.sdk.QrcService;
import com.zhouyu.paydemo.unipay.sdk.SDKConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 用途：收款<br>
 * 日期： 2017-03<br>
 * 声明：以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己需要，按照技术文档编写。该代码仅供参考，不提供编码，性能，规范性等方面的保障<br>
 */
@SuppressWarnings("serial")
@Slf4j
public class ShouKuan extends HttpServlet{

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String acqCode = req.getParameter("acqCode");
		String merId = req.getParameter("merId");
		String amount = req.getParameter("amount");
		
        String accNo = req.getParameter("accNo");
        String name = req.getParameter("name");
        String certifTp = req.getParameter("certifTp");
        String certifId = req.getParameter("certifId");
	        
		Map<String, String> contentData = new HashMap<String, String>();
		// 版本号
		contentData.put("version", "1.0.0");
		// 收款
		contentData.put("txnType", "0700000903");
		// 机构代码
		contentData.put("acqCode", acqCode);
		// 商户代码
		contentData.put("merId", merId);
		// 二维码流水号 2位固定前缀+2位二维码请求类型+4位编码（由银联业务运营分配）+10位随机数+1位校验位
		String qrNo = "62" + "11" + "0305" + RandomStringUtils.randomNumeric(10);
        String lastQrNo = String.valueOf(QrcService.genLuhn(qrNo));
        contentData.put("qrNo",qrNo + lastQrNo);
        //contentData.put("qrNo", "6212030510000000197");
        
    	//金额，可选上送，如果这里不送,那么在收款方查询交易中不会返回amout域， 付款交易中就需要上送金额字段
        //如果这里送了，那么收款方查询交易中返回amout域， 付款交易中送返回的金额字段
    	contentData.put("amount",amount);
        
		// 币种
		contentData.put("currencyCode","156");
		// 二维码请求类型
		contentData.put("qrType","11"); 
		
		// 限制支付次数，这里配置可以付款支付2次
		contentData.put("limitCount","2");
		// 二维码有效时间
		contentData.put("qrValidTime","6000");
		
        Map<String, String> payeeInfoMap = new HashMap<String, String>(); 
        payeeInfoMap.put("accNo", accNo);
        payeeInfoMap.put("name", name);
        payeeInfoMap.put("certifTp", certifTp);
        payeeInfoMap.put("certifId", certifId);
        
		// 收款方敏感信息
		contentData.put("payeeInfo", DemoBase.getPayeeInfo(payeeInfoMap,DemoBase.encoding));
		// 收款结果接收地址
		contentData.put("payeeUrl","http://222.222.222.222:8080/QRCSample/shouKuanResultNotifyReceive");
		// 收款方附言
		contentData.put("payeeComments",QrcService.base64Encode("{comment=收款方附言}", DemoBase.encoding));
		// 业务级别
		contentData.put("busLevel","0000");
		// 收款行信息
		contentData.put("payeeBankInfo", "XX银行");
		// 加密证书ID
		//contentData.put("encryptCertId", CertUtil.getEncryptCertId());
        // 卡属性
		contentData.put("cardAttr", "01");
		// 保留域
		contentData.put("reserved",""); 
		
		Map<String, String> reqData = QrcService.sign(contentData,DemoBase.encoding);		 //报文中certId,signature的值是在signData方法中获取并自动赋值的，只要证书配置正确即可。
		String requestUrl = SDKConfig.getConfig().getQrcBackTransUrl();
		Map<String, String> rspData = QrcService.post(reqData,requestUrl,DemoBase.encoding);  //发送请求报文并接受同步应答（默认连接超时时间30秒，读取返回结果超时时间30秒）;这里调用signData之后，调用submitUrl之前不能对submitFromData中的键值对做任何修改，如果修改会导致验签不通过
		
		if(!rspData.isEmpty()){
			if(QrcService.validate(rspData, DemoBase.encoding)){
				log.info("验证签名成功");
				String respCode = rspData.get("respCode") ;
				if(("00").equals(respCode)){

				}else{
					//其他应答码为失败请排查原因
					//TODO
				}
			}else{
				log.error("验证签名失败");
				//TODO 检查验证签名失败的原因
			}
		}else{
			//未返回正确的http状态
			log.error("未获取到返回报文或返回http状态码非200");
		}
		
		String reqMessage = DemoBase.genHtmlResult(reqData);
		String rspMessage = DemoBase.genHtmlResult(rspData);
		resp.getWriter().write("</br>请求报文:<br/>"+reqMessage+"<br/>" + "应答报文:</br>"+rspMessage+"");
		
	}
	
	public static void main(String[] args) {
		String qrNo = "62" + "12" + "0305" + "1000000019";
        String lastQrNo = String.valueOf(QrcService.genLuhn(qrNo));
        System.out.println(lastQrNo);
	}
}
